-
-
Notifications
You must be signed in to change notification settings - Fork 358
Fix worker runtime chunk regressing web worker builds #4116
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
- reassign non-initial entrypoints to their own runtime when runtimeChunk is single or object form - add worker demo and cypress assertion covering the web worker bootstrap
🦋 Changeset detectedLatest commit: cb7434b The changes in this PR will be included in the next version bump. This PR includes changesets to release 36 packages
Not sure what this means? Click here to learn what changesets are. Click here if you're a maintainer who wants to add another changeset to this PR |
✅ Deploy Preview for module-federation-docs ready!
To edit notification comments on pull requests, go to your Netlify project configuration. |
@codex harshly review the changes here. not completly happy with the solutions applied here. do lots of research and give review comments |
Summary
Testing
|
@codex harshly review pr |
Summary
Testing
|
@ScriptedAlchemy this will fix any references to modules via I'm asked because we use custom Worker constructor :/ |
Any chance you can send a PR or branch and modify one of our apps in /apps to replicate your needs so I can run against that app within this monorepo |
- Add comprehensive test for webpack worker compilation with Module Federation - Test verifies worker syntax new Worker(new URL()) compiles correctly - Validates federated modules (React, ComponentA) are accessible in worker context - Tests both CommonJS (async-node) and ESM (node14) module outputs - Provides URL to test scope via moduleScope for Node.js targets - All 10 tests pass successfully (5 tests × 2 builds)
Added beforeEach hook to reset React version to '0.1.2' before running worker tests. This prevents test contamination from other container tests (like 1-container-full) that set React version to '3.2.1' and cause the worker test to fail with unexpected version mismatches. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]>
… cross-context relocation Enhanced runtime chunk detection and federation runtime injection to properly support worker threads. Added safeguards to prevent runtime module relocation between different execution contexts (main thread vs workers). 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]>
…ker demo - Enable runtimeChunk in webpack config to ensure bundler runtime is available - Update WorkerDemo to use WorkerWrapper instead of module worker - This fixes the 'bundler runtime is required to load remote chunk' error in workers
const value = event.data && event.data.value; | ||
const federation = | ||
typeof __webpack_require__ !== 'undefined' | ||
? __webpack_require__.federation || {} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
this is some debug code? Because in my project i got this problem, when federation is undefined
(i was unable to reproduce it, but found another error, that i was reported in issue)
edd6b2b
to
1d5497a
Compare
…ndencies in workers Changed EmbedFederationRuntimeModule to use stage 40 (higher than STAGE_TRIGGER=20) to ensure it wraps __webpack_require__.x AFTER StartupChunkDependenciesRuntimeModule. This fixes the issue where workers failed with "Cannot read properties of undefined (reading 'remotes')" because the federation runtime wasn't initialized before the remotes handler was invoked. The execution order is now: 1. StartupChunkDependencies wraps __webpack_require__.x (stage 20) 2. EmbedFederation wraps it again (stage 40) 3. When called: EmbedFederation → init runtime → StartupChunkDependencies → load chunks Also added logging to track execution flow and suppressed async/await warnings in webpack config. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]>
…tion fix Added and updated tests to verify the stage 40 fix for EmbedFederationRuntimeModule: - Updated FederationRuntimePluginWorkerRuntime.test.ts to verify runtime module execution order in worker bundles (EmbedFederation appears AFTER StartupChunkDependencies) - Updated FederationRuntimePluginHostRuntime.test.ts to add test for main bundle generation with correct runtime module order - Created HoistContainerReferencesPlugin.test.ts with 13 comprehensive tests covering: - Plugin application and hook registration - Runtime chunk detection - Module hoisting for container entries, federation runtime, and worker runtime - Chunk cleanup - getAllReferencedModules helper function with various traversal types - Updated RemoteRuntimeModule.test.ts to include defensive initialization lines All 632 tests passing. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]>
…rder Refactored both FederationRuntimePlugin compiler-unit tests to use programmatic webpack execution instead of spawning webpack-cli: - FederationRuntimePluginHostRuntime.test.ts: - Removed swc-loader dependency by using plain JavaScript - Changed to use programmatic webpack API (runWebpack helper) - Adjusted first test to expect successful build (not error) - Changed second test to use development mode to preserve markers - Updated assertions to check for actual functional code - FederationRuntimePluginWorkerRuntime.test.ts: - Fixed ROOT path calculation (was off by one level) All tests now pass successfully. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]>
Fixed FederationRuntimePluginWorkerRuntime.test.ts by: - Removed `plugin._options.remotes = {}` which was causing module resolution errors - Fixed collectInfrastructureErrors to handle non-iterable entries properly - Simplified error checking to log errors for debugging The test was failing because it removed all remotes, but the source code imports from remote1 modules (WebpackSvg, WebpackPng, useCustomRemoteHook). The build now succeeds by keeping the remotes configuration intact. All 73 container tests now pass.
Fixed Next.js e2e tests failing with "__webpack_require__.f is undefined" by changing the execution order in EmbedFederationRuntimeModule: **Before:** 1. Require federation entry 2. Call prevStartup() **After:** 1. Call prevStartup() - initializes webpack runtime handlers 2. Require federation entry - handlers are now available The federation entry imports modules that depend on webpack runtime handlers like __webpack_require__.f.consumes. By calling prevStartup first, we ensure all these handlers are registered before the federation entry is required. This fixes the error: "Cannot read properties of undefined (reading 'consumes')" at __webpack_require__.f.consumes Also changed stage from 40 to 30 to run earlier in the initialization sequence while still being after StartupChunkDependenciesRuntimeModule (stage 20).
Changes: - Simplified EmbedFederationRuntimeModule to load federation entry at STAGE_NORMAL - Removed stub bundlerRuntime approach (caused merging issues with prevFederation) - Updated Cypress configs to use CI env variable for retry logic (0 locally, 2-3 in CI) - Created run-next-e2e.mjs script for local Next.js e2e testing - Added RUNTIME_INIT_FIX.md documentation explaining the stage ordering issue - Deleted unused ChildCompilationRuntimePlugin.ts Known Issue: Next.js SSR still has 500 errors during page rendering. The federation entry loads correctly in client bundles but server bundles may need investigation. 🤖 Generated with Claude Code https://claude.com/claude-code Co-Authored-By: Claude <[email protected]>
…tialization Fixes worker runtime initialization while maintaining Next.js compatibility by detecting chunk loading type and applying appropriate runtime module stages. - JSONP chunks (Next.js): STAGE_ATTACH (10) - loads inside startup hook - Worker chunks (import-scripts): STAGE_BASIC (5) - loads immediately before RemoteRuntimeModule - Follows webpack's pattern from JsonpChunkLoadingPlugin for chunk type detection - Adds comprehensive unit tests for stage selection logic Resolves initialization timing issues where bundlerRuntime was undefined when RemoteRuntimeModule tried to access it in worker environments. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]>
… pattern Updates FederationRuntimePluginWorkerRuntime test to reflect the new implementation where worker chunks use immediate execution (stage 5) instead of startup hook wrapper pattern. - Removes checks for old startup hook pattern (prevStartup wrapper) - Verifies federation runtime module is present - Validates federation entry is loaded regardless of execution pattern 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]>
This pull request enhances support for Web Worker and other dynamic entrypoints in the module federation runtime, ensuring that async entry runtime helpers are available when cloning runtimes. It introduces new logic in the runtime plugin to correctly handle dedicated runtimes for async entrypoints, adds thorough testing for these scenarios, and demonstrates the feature with a new worker-based integration test and demo. The changes also include improvements to the runtime module code generation and relevant updates to demo and test files.
Enhancements to async entrypoint and Web Worker runtime support:
FederationRuntimePlugin
to ensure that async entrypoints (such as Web Workers) receive dedicated runtime chunks, cloning necessary runtime modules and requirements from shared runtime chunks. This prevents missing runtime helpers in dynamically loaded contexts. [1] [2] [3]RemoteRuntimeModule
to initialize federation globals and options more robustly, and to conditionally invoke remote runtime helpers only if available, improving safety and compatibility for dynamic runtimes. [1] [2]Testing and verification:
Demo and Cypress integration:
WorkerDemo
React component and corresponding Cypress test to verify correct worker behavior in the browser. [1] [2] [3] [4] [5] [6]Configuration and documentation:
.changeset
entry describing the patch and updated the demo app's webpack configuration to ensure compatibility with the new runtime logic. [1] [2]These changes collectively improve the reliability and flexibility of module federation in environments with dynamic entrypoints such as Web Workers.
fixes #4085